package util

func NewSet[T comparable](items ...T) Set[T] {
	set := Set[T]{}

	for _, item := range items {
		set.Add(item)
	}

	return set
}

type Set[T comparable] map[T]struct{}

func (r *Set[T]) Len() int { // 长度
	return len(*r)
}
func (r *Set[T]) IsEmpty() bool { // 是否为空
	return r.Len() == 0
}

func (r *Set[T]) Add(items ...T) {
	for _, item := range items {
		(*r)[item] = struct{}{}
	}
}
func (r *Set[T]) Remove(items ...T) {
	for _, item := range items {
		delete(*r, item)
	}
}
func (r *Set[T]) Contains(item T) bool {
	_, ok := (*r)[item]
	return ok
}

func (r *Set[T]) Clone() Set[T] {
	set := Set[T]{}

	set.Add(r.ToSlice()...)

	return set
}
func (r *Set[T]) ToSlice() []T {
	set := make([]T, 0, r.Len())

	for item := range *r {
		set = append(set, item)
	}

	return set
}
